#include "os_semaphore.h"

os_semaphore::os_semaphore(int count) :
    m_count(count)
{
}

// 获取信号量（P操作）
void os_semaphore::wait()
{
    std::unique_lock<os_mutex> lock(m_mutex);
    m_cv.wait(lock, [this] {
        return m_count > 0;
    });
    --m_count;
}

// 带超时的获取信号量
bool os_semaphore::try_wait_for(const std::chrono::milliseconds& timeout)
{
    std::unique_lock<os_mutex> lock(m_mutex);
    if (m_cv.wait_for(lock, timeout, [this] {
            return m_count > 0;
        }))
    {
        --m_count;
        return true;
    }
    return false;
}

// 释放信号量（V操作）
void os_semaphore::signal()
{
    std::unique_lock<os_mutex> lock(m_mutex);
    ++m_count;
    m_cv.notify_one();
}

// 一次性释放多个信号量
void os_semaphore::signal(int n)
{
    std::unique_lock<os_mutex> lock(m_mutex);
    m_count += n;
    for (int i = 0; i < n; ++i) {
        m_cv.notify_one();
    }
}

// 获取当前信号量计数
int os_semaphore::get_count() const
{
    std::unique_lock<os_mutex> lock(m_mutex);
    return m_count;
}